package org.example.array;

/**
 * 用数组实现ArrayList
 *
 * @author 玄鸽
 * @since 2023/8/28
 */
public class MyArrayList {

    /**
     * 存储元素的数组
     */
    private final int[] arr;

    /**
     * 数组当前元素的数量
     */
    private int size;

    /**
     * 构造方法，初始化数组大小为capacity
     * @param capacity 容量
     */
    public MyArrayList(int capacity) {
        arr = new int[capacity];
        size = 0;
    }

    /**
     * 添加元素到数组末尾
     *
     * @param element 元素
     */
    public void add(int element) {
        if (size == arr.length) {
            throw new RuntimeException("数组为空，不能添加元素");
        }
        arr[size] = element;
        size++;
    }

    /**
     * 根据下标删除元素，如果索引越界则抛出异常
     *
     * @param index 下标
     */
    public void remove(int index) {
        if (index < 0 || index > size) {
            throw new RuntimeException("下标超出范围");
        }
        for (int i = index;i < size - 1;i++) {
            arr[i] = arr[i + 1];
        }
        size--;
    }

    /**
     * 根据下标修改元素，如果元素越界则抛出异常
     *
     * @param index 下标
     * @param element 元素
     */
    public void set(int index, int element) {
        if (index < 0 || index >= size) {
            throw new RuntimeException("下标超出范围");
        }
        arr[index] = element;
    }

    /**
     * 根据元素值查找对应下标，如果没找到返回-1
     *
     * @param element 元素
     * @return 下标
     */
    public int find(int element) {
        for (int i = 0;i < size; i++) {
            if (arr[i] == element) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 获取数组中元素的数量
     *
      * @return 数量
     */
    public int getSize() {
        return size;
    }
}
